第 2 章 变量
学习目标:
- 说出 变量的定义和目的
- 掌握 本地变量的查看格式和使用场景
- 掌握 全局变量的查看/定义格式和使用场景
- 掌握 普通变量的标准查看方法
- 说出 shell内置变量的特性和分类
- 掌握 shell内置变量的使用场景
2.2.1. 变量定义
普通变量
普通变量的定义方式有如下三种,接下来我们就分别说一下这三种方式
方式一:
变量名=变量值 重点:变量值必须是一个整体,中间没有特殊字符
方式二:
变量名='变量值' 重点:不解析变量值的内容
方式三:
变量名="变量值" 重点:如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B
习惯:数字不加引号,其他默认加双引号
命令变量
命令变量有两种定义方式,接下来我们就来介绍一下这两种方式
定义方式一: 变量名=`命令` 注意:`是反引号
定义方式二: 变量名=$(命令)
执行流程:
1、执行`或者$()范围内的命令
2、将命令执行后的结果,赋值给新的变量名A
2.2.2 变量访问
查看变量:
方式一: $变量名
方式二: "$变量名"
方式三: ${变量名}
方式四:标准使用方式 "${变量名}"
取消变量: unset 变量名
2.2.3 变量分类
shell 中的变量分为三大类 本地变量、全局变量、shell内置变量
1. 本地变量
本地变量是:在当前系统的某个环境下才能生效的变量,作用范围小。
2. 全局变量
全局变量是什么
全局变量是:在当前系统的所有环境下都能生效的变量。
环境是什么
环境是:每打开一个终端是一个shell环境,使用非source执行方式时,会开启子进程,也是一个shell环境,称为子shell环境。
查看全局变量
可以通过命令查看所有全局变量
env # 只显示全局变量,主要是加载了~/.bashrc和/etc/profile文件
定义全局变量
方法一:
变量名=值
export 变量
方法二:(最常用)
export 变量名=值
生效范围
只对当前shell环境及子shell环境有效,shell退出后全局变量消失
全局变量演示:
python@ubuntu:~/Desktop$ env | grep user # 当前全局变量中没有user变量
python@ubuntu:~/Desktop$ export user=python3
python@ubuntu:~/Desktop$ env | grep user # 当前全局变量中有user变量
user=python3
打开新的终端执行env命令:
python@ubuntu:~/Desktop$ env | grep user # 当前全局变量中没有user变量
test.sh 脚本内容如下:
#!/bin/bash
echo $user
终端执行命令如下:
python@ubuntu:~/Desktop$ user=python3
python@ubuntu:~/Desktop$ echo $user
python3
python@ubuntu:~/Desktop$ bash test.sh # 当前shell环境有user变量,但是局部变量,子shell无法使用
python@ubuntu:~/Desktop$ export user
python@ubuntu:~/Desktop$ bash test.sh # user变为全局变量,子shell可以使用
python3
test.sh 脚本内容如下:
#!/bin/bash
export user=python3
echo $user
终端执行命令如下:
python@ubuntu:~/Desktop$ echo $user # 当前shell环境下没有user变量
python@ubuntu:~/Desktop$ bash test.sh # 在test.sh脚本中定义了全局变量
python3
python@ubuntu:~/Desktop$ echo $user # 在当前shell环境下没法使用子shell定义的全局变量
如果想要自己定义的全局变量在跟系统的全局变量一样在所有环境都有效,需要在~/.bashrc或/etc/profile文件中定义:
- 修改~/.bashrc后,直接打开新的终端,定义的全局变量就生效了,此方式只对当前用户有效
- 修改/etc/profile时,需要重启操作系统,定义的全局变量才生效,此方式对所有用户有效
- 上面两种方式在修改文件后,如果想让全局变量在当前终端生效,需要执行命令source ~/.bashrc或source /etc/profile
2.2.5 shell内置变量
我们之前学习的本地变量,全局变量都是需要通过定义,然后才能实现相应功能的,那么有没有一些变量我们可以直接拿过来使用实现某种具体的功能呢?有,这就是shell内置变量
和脚本文件有关
符号 | 意义 |
---|---|
$0 | 获取当前执行的shell脚本文件名 |
$$ | 获取执行shell脚本的进程号 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10} |
$# | 获取当前shell命令行中参数的总个数 |
$? | 获取执行上一个指令的返回值(0为成功,非0为失败) |
内置变量演示效果:
- $0 获取脚本的名称
- $$ 获取执行shell脚本的进程号
示例:
脚本内容如下:
#!/bin/bash
# 获取脚本的名称
echo "我脚本的名称是: file.sh"
echo "我脚本的名称是:$0"
echo "我脚本执行的进程号的是:$"
$# 获取当前脚本传入参数的数量
$n 获取当前脚本传入的第n个位置的参数
示例:
脚本内容如下:
#!/bin/bash
# 获取当前脚本传入的参数数量
echo "当前脚本传入的参数数量是: $#"
# 获取指定位置的参数
echo "第一个位置的参数是: $1"
echo "第二个位置的参数是: $2"
echo "第三个位置的参数是: $3"
echo "第四个位置的参数是: $4"
- $? 获取文件执行或者命令执行的返回状态值
示例:
终端执行命令如下:
bash nihao # 不存在nihao文件
bash: nihao: No such file or directory
echo $?
127
ls
file1.sh num.sh test.sh weizhi.sh
echo $?
0
字符串精确截取
格式:${变量名:起始位置:截取长度}
示例:
${file:0:5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
默认值相关
- 场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容
格式:
${变量名:-默认值}
套餐示例:
如果我输入的参数为空,那么输出内容是 "您选择的套餐是: 套餐 1"
如果我输入的参数为n,那么输出内容是 "您选择的套餐是: 套餐 n"
脚本内容如下:
#!/bin/bash
# 套餐选择演示
a="$1"
echo "您选择的套餐是: 套餐 ${a:-1}"
- 场景二:
如果变量没有定义,将默认值赋值给变量
格式:
${变量名:=默认值}
场景示例:
不管我说国家法定结婚年龄是多少岁,都输出国家法定结婚年龄(男性)是22岁
脚本内容如下:
#!/bin/bash
# 默认值演示示例二
a="$1"
echo "国家法定结婚年龄(男性)是 ${a:=22} 岁"
echo "国家法定结婚年龄(男性)是 ${a} 岁"
- 场景三:
当变量存在的时候输出提示信息
格式:
${变量名:+提示信息}
场景示例:
当脚本获取的参数时提示已经获取到参数
脚本内容如下:
#!/bin/bash
# 默认值演示示例二
a="$1"
echo "${a:+已经获取到第一位的参数}"
小结:
shell三种变量: 本地+全局+内置
本地变量种类:
普通变量定义格式: 变量值 '变量值' "变量值"
命令变量定义格式: `命令` $(命令)
全局变量:
查看命令:env
标准定义格式:export 变量名=变量值
普通变量查看方法:$变量名 "$变量名" ${变量名} "${变量名}"
变量取消专用命令:unset
shell内置变量三种类:
文件相关: $0 $n $# $?
字符串相关: ${变量名:起始位置:截取长度}
默认值相关: ${变量名:-默认值} ${变量名:=默认值} ${变量名:+默认值}